Installer Alpine Linux sur un Raspberry PI 4
Objectifs
L'idée est d'avoir sur ce serveur un ensemble de services pour la maison, comme le partage de fichiers, site web de chanson. L'utilisation du Raspberry pi est essentiel ici car l'idée est d'économiser un abonnement chez Google Drive ou Microsoft ou autre service de partage de fichiers. Or le Raspberry pi ne consomme pas beaucoup, ainsi on peut le laisser allumer tout le temps. Par exemple le serveur nextcloud permet d'avoir un espace de stockage accessible depuis n'importe où. Il existe déjà 1 serveur qui tourne en permanence mais il consomme un peu plus, n'a qu'un disque (pas de RAID 1) et il est moins puissant.
Matériels
Le Raspberry Pi 4 8Go est un ordinateur puissant et peu gourmand en ressource.
Pour le stockage, je branche au Raspberry Pi un boitier externe USB supportant le RAID. Chez LDLC le boitier Icy Box IB-RD2243U31 est vendu aux alentours de 50 euros. J'ai acheté 2 disques SSD de 1To , ceux-ci sont utilisés en RAID 1, c'est-à-dire en mode miroir. Il faut choisir le RAID 1 en positionnant les switchs comme indiqué sur le boitier et en restant appuyé sur reset pendant 5 secondes.
Installation d'Alpine Linux
L'installation de cette distribution sur Raspberry Pi va se faire en 2 temps. En effet par défaut ce système est entièrement en RAM (système de fichier compris en lecture seule). A ce jour le script d'installation setup-alpine ne supporte pas l'installation sur disque (sys mode), cette procédure va se faire manuellement ici. L'idée est d'avoir la partition de boot sur la carte SD (1Go), la partition contenant le système de fichier racine "/" sur le SSD (64Go), et enfin une partition qui contiendra toutes les données utilisateurs (documents, musique, backup...), un peu plus de 900Go.
Préparation de la carte Micro SD
Si la carte correspond à /dev/mmcblk0 voici la procédure à suivre
- Executer fdisk
fdisk /dev/mmcblk0
- Appuyer sur "n" pour créer la partition.
- Appuyer sur "p" pour la transformer en partition principale.
- Appuyer sur "1" pour lui donner un numéro dans la table de partition.
- Appuyer sur Entrée pour accepter le secteur de départ par défaut.
- Taper +taille pour choisir la taille. Dans mon cas j'ai besoin de 1go, donc "+1G".
- Après l'avoir créée, appuyer sur "a" pour la rendre bootable.
- En appuyant sur "p" vérifier que la partition est présente
- Maintenant il faut définir le type de la partition. Appuyer sur "t" pour paramétrer le type de partition, appuyer sur "c" pour "W95 FAT32 (LBA)".
- Appuyer sur "w" pour écrire la table de partition et quitter fdisk
- Il faut maintenant formater la partition
mkfs.vfat -F 32 /dev/mmcblk0p1
- Il est possible de donner un nom à cette partition
fatlabel /dev/mmcblk0 BOOT_PI2
Installation
Il faut d'abord télécharger la dernière version d'Alpine Linux. Pour le Raspberry Pi 4 il faut prendre l'architecture aarch64. Le fichier récupéré est une archive prête à être désarchivée sur une carte micro SD préalablement formatée en FAT32 et bootable.
- Téléchargement de la dernière version, le fichier fait environ 90 Mo (c'est pas gros)
wget http://dl-cdn.alpinelinux.org/alpine/v3.12/releases/aarch64/alpine-rpi-3.12.1-aarch64.tar.gz
- Monter la carte SD
mount /dev/mmcblk0p1 SD cd SD
- Désarchiver le contenu sur la carte
tar xvzf ../alpine-rpi-3.12.1-aarch64.tar.gz
- Créer le fichier usercfg.txt pour configurer les paramètres bas niveau du système.
La spécification de ces paramètres est définie sur le site de Raspberry Pi
enable_uart=1 gpu_mem=32 disable_overscan=1 - Démonter la carte
umount /dev/mmcblk0
Paramètrage
Exécuter le script de paramétrage et suivre la procédure
setup-alpine
Une fois terminé mettre à jour le système
apk update apk upgrade
Installer le système de fichier racine sur le SSD
Je vais considérer ici que le SSD correspond au périphérique /dev/sda, vérifier bien au préalable que le RAID 1 est bien sélectionné. Rester appuyé sur le bouton reset de l'Icy Box pour appliquer la sélection, attention cela détruit les données des disques.
- Exécuter fdisk sur le SSD
fdisk /dev/sda
- Créer 2 partitions linux (cf procédure plus haut) une de 64Go l'autre prenant le restant du disque
- Formater les partitions créées en ext4
mkfs.ext4 /dev/sda1 mkfs.ext4 /dev/sda2
- Monter la première partition
mount /dev/sda1 /mnt
- Monter le répetoire boot la carte dans le répertoire /mnt/boot
mkdir /mnt/boot mount /media/mmcblk0p1/boot /mnt/boot - Exécuter le script permettant de choisir le mode système sur l'emplacement voulu.
Cela a pour effet de préparer (copier) la partition avec le système de fichier racine.
Ignorer les messages d'alertes concernant syslinux et extlinux.
setup-disk -m sys /mnt
- Remonter en écriture la partition de boot (la carte SD)
mount -o remount,rw /media/mmcblk0p1
- créér le répertoire
mkdir /mnt/media/mmcblk0p1
- Editer les points de montage dans /mnt/etc/fstab
/dev/mmcblk0p1 /media/mmcblk0p1 vfat defaults 0 0 /media/mmcblk0p1/boot /boot none defaults,bind 0 0 - Mettre une option au démarrage du noyau pour lui donner l'emplacement du sytème de fichier racine,
en rajoutant root=/dev/sda1 dans le fichier /media/mmcblk0p1/cmdline.txt
root=/dev/sda1 modules=sd-mod,usb-storage,ext4 quiet rootfstype=ext4 - Ou recopier le contenu du fichier /media/mmcblk0p1/boot/cmdline.txt dans /media/mmcblk0p1/cmdline.txt
- Le système est prêt à être rebooté :-)
Après avoir installé avahi daemon et dbus requis pas ce premis, le système semble prend que 36Mo en mémoire.
pi2:~# free
total used free shared buff/cache available
Mem: 8003968 36168 7926596 188 41204 7876272
Swap: 0 0 0
Pour la température Du raspberry pi il a fallu que je change de boitier pour mieux refroidir celui-ci flirc. Celui-ci est un boitier en aluminium qiu refroidit le raspberry pi passivement.
La température semble correcte maintenant ~43°C, en le laissant allumé toute une nuit (sans rien faire). Malheureusement, je n'ai pas la mesure d'avant avec le boitier en plastique, mais ça devait être bien plus vue la température du boitier
pi2:~# cat /sys/class/thermal/thermal_zone0/temp 42842
Documentation des commandes apk: https://wiki.alpinelinux.org/wiki/Alpine_Linux_package_management
Installation de java
apk add openjdk8-jre
Mise à jour du bootloader (EEPROM) sur Alpine Linux
Note : Sur Alpine (mode diskless), la partition de boot est en lecture seule et n'est pas montée sur /boot. Il faut installer les dépendances nécessaires, passer la partition en lecture-écriture et spécifier les variables d'environnement.
# 1. Installation des dépendances requises apk add raspberrypi raspberrypi-utils-vcgencmd pciutils findmnt # 2. Récupération de l'utilitaire officiel git clone https://github.com/raspberrypi/rpi-eeprom.git cd rpi-eeprom export PATH=$PATH:/opt/vc/bin/:. # 3. Remonter la partition de boot (ex: /media/mmcblk0p1) en lecture-écriture mount -o remount,rw /media/mmcblk0p1 # 4. Préparer la mise à jour avec les bonnes variables de chemins BOOTFS=/media/mmcblk0p1 FIRMWARE_DIR=/media/mmcblk0p1 ./rpi-eeprom-update -a # 5. Forcer l'écriture et redémarrer pour appliquer le flash sync reboot
Pour vérifier le statut après le redémarrage :
cd rpi-eeprom BOOTFS=/media/mmcblk0p1 FIRMWARE_DIR=/media/mmcblk0p1 ./rpi-eeprom-update
Mise à niveau globale d'Alpine Linux (Diskless - Automatisée)
Note : Ce script extrait dynamiquement l'architecture, la version cible et le support de stockage depuis votre configuration système. Il effectue ensuite les vérifications, applique les mises à jour et remplace le noyau proprement en préservant vos configurations.
# ==============================================================================
# 1. PRÉPARATION ET CHARGEMENT DES VARIABLES SYSTÈME
# ==============================================================================
# /!\ ÉTAPE MANUELLE COMMENCEZ PAR LÀ : Éditez les dépôts pour cibler la nouvelle version (ex: v3.24 ou latest-stable)
nano /etc/apk/repositories
# Mise à jour de l'index et des outils apk
apk update && apk version -l '<'
apk upgrade
lbu ci
# Chargement automatique de l'environnement générique
. /etc/os-release
. /etc/lbu/lbu.conf
ARCH=$(cat /etc/apk/arch)
# ------------------------------------------------------------------------------
# VÉRIFICATION DES VARIABLES (Sécurité)
# ------------------------------------------------------------------------------
echo "--- VERIFICATION DES PARAMÈTRES ---"
echo "Version Alpine cible : $VERSION_ID"
echo "Média de stockage : $LBU_MEDIA"
echo "Architecture matérielle : $ARCH"
echo "------------------------------------"
# /!\ ATTENTION : Si l'une de ces valeurs est vide ou incorrecte, ne lancez pas la suite !
# ==============================================================================
# 2. NETTOYAGE CHIRURGICAL ET PRÉPARATION DE LA CARTE SD
# ==============================================================================
rc-service modloop stop
mount /media/$LBU_MEDIA -o remount,rw
cd /media/$LBU_MEDIA
# Sauvegarde temporaire du fichier de configuration matériel principal
mv config.txt config.txt.bak
# Nettoyage de la racine du boot en préservant le cache, les .apkvol et votre config.txt.bak
find . -maxdepth 1 ! -name 'cache' ! -name '*.apkvol.tar.gz' ! -name 'usercfg.txt' ! -name 'config.txt.bak' ! -name '.' -exec rm -rf {} +
# ==============================================================================
# 3. TÉLÉCHARGEMENT ET EXTRACTION DU NOUVEAU FIRMWARE / NOYAU
# ==============================================================================
wget https://dl-cdn.alpinelinux.org/alpine/latest-stable/releases/${ARCH}/alpine-rpi-${VERSION_ID}-${ARCH}.tar.gz
wget https://dl-cdn.alpinelinux.org/alpine/latest-stable/releases/${ARCH}/alpine-rpi-${VERSION_ID}-${ARCH}.tar.gz.sha256
# Validation de l'intégrité du fichier téléchargé
sha256sum -c *.sha256
# Extraction du système de fichiers de démarrage et nettoyage des archives
tar zxf alpine-rpi-*.tar.gz && sync
rm alpine-rpi-*
# ==============================================================================
# 4. RESTAURATION DE LA CONFIGURATION ET REBOOT
# ==============================================================================
mv config.txt.bak config.txt
lbu ci -d
# Application et redémarrage imminent
sync && reboot
Nettoyage Post-Redémarrage (À exécuter après le reboot)
Une fois que le Raspberry Pi a redémarré avec succès sur la nouvelle version, nettoyez le cache local de l'APK en utilisant les variables dynamiques :
. /etc/lbu/lbu.conf mount /media/$LBU_MEDIA -o remount,rw rm -rf /media/$LBU_MEDIA/cache/* apk update && apk cache -v download mount /media/$LBU_MEDIA -o remount,ro
Sources
- https://wiki.alpinelinux.org/wiki/Raspberry_Pi_4_-_Persistent_system_acting_as_a_NAS_and_Time_Machine
- https://www.stephenwagner.com/2020/03/21/create-boot-partition-layout-raspberry-pi/